package com.hsnn.medstgmini.util;

import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

public class DateUtil {

	/**
	 * 生成一个系统时间
	 * 日期格式：yyyy-MM-dd HH:mm:ss
	 * @return String
	 */
	public static String dateTime() {
		return dateTime(new Date());
	}
	
	/**
	 * 生成一个系统时间
	 * 日期格式：yyyy-MM-dd
	 * @return String
	 */
	public static String date() {
		return date(new Date());
	}

	
	/** 
	 *  时间类型转换 :Timestamp->String
	 *  日期格式：yyyy-MM-dd
	 * @return String
	 */
	public static String date(Timestamp stamp) {
		if (stamp != null) {
			Date date = new Date(stamp.getTime());
			return date(date);
		}
		return null;
	}
	
	/** 
	 *  时间类型转换 :Timestamp->String
	 *  日期格式：yyyy-MM-dd HH:mm:ss
	 * @return String
	 */
	public static String dateTime(Timestamp stamp) {
		if (stamp != null) {
			Date date = new Date(stamp.getTime());
			return dateTime(date);
		}
		return null;
	}

	/** 
	 *  时间类型转换 :Timestamp->String
	 *  @param Timestamp stamp 时间类型
	 *  @param String format 日期格式
	 *  @return String
	 */
	public static String format(Timestamp stamp, String format) {
		if (stamp != null) {
			Date date = new Date(stamp.getTime());
			return new SimpleDateFormat(format).format(date);
		}
		return null;
	}
	
	/** 
	 *  String型的字符串转换成"yyyy-MM-dd HH:mm:ss"的date类型
	 *  @param String datetime 
	 *  @return Date
	 */
	public static Date parseDateTime(String datetime) {
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		try {
			return format.parse(datetime);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return new Date();
	}
	
	/** 
	 *  String型的字符串转换成"yyyy-MM-dd HH"的date类型
	 *  @param String datetime 
	 *  @return Date
	 */
	public static Date parseDateHHTime(String datetime) {
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH");
		try {
			return format.parse(datetime);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return new Date();
	}
	
	/** 
	 *  String型的字符串转换成"yyyy-MM-dd HH:mm:ss"的Timestamp类型
	 *  @param String datetime 
	 *  @return Date
	 */
	public static Timestamp StringTime2Timestamp(String datetime) {
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		try {
			return new Timestamp(format.parse(datetime).getTime());
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	/** 
	 *  String型的字符串转换成"yyyy-MM-dd"的date类型
	 *  @param String date 
	 *  @return Date
	 */
	public static Date parseDate(String date) {
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
		try {
			return format.parse(date);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return new Date();
	}

	/**
	 * 
	 * @category 判断某个日期是否在开始时间与结束时间之间
	 * @author 邱磊
	 * @date 2015年6月16日 上午10:47:50
	 * @param date要判断时间
	 * @param startDate开始时间
	 * @param endDate结束时间
	 * @return
	 */
	public static boolean isInDate(Date date, Date startDate, Date endDate) {
		if (null != date && null != startDate && null != endDate) {
			Long dt = date.getTime();
			Long startdt = startDate.getTime();
			Long enddt = endDate.getTime();
			if (dt >= startdt && dt <= enddt) {
				return true;
			}
		}
		return false;
	}

	public static Timestamp getTimeStamp() {
		Date date = new Date();
		return new Timestamp(date.getTime());
	}
	
	/** 
	 *  Date类型转成Timestamp类型
	 *  @param Date date 
	 *  @return Timestamp
	 */
	public static Timestamp getTimeStamp(Date date) {
		if (date != null) {
			return new Timestamp(date.getTime());
		}
		return null;
	}
	
	/** 
	 *  日期设置：设置多少天后的时间类型 如：明天的这个时候 则days=1
	 *  @param int days 多少天之后
	 *  @return Timestamp
	 */
	public static Timestamp getTimeStamp(int days) {
		Calendar calendar = Calendar.getInstance();
		int day = calendar.get(Calendar.DAY_OF_MONTH);
		day += days;
		calendar.set(Calendar.DAY_OF_MONTH, day);
		return new Timestamp(calendar.getTime().getTime());
	}
	/** 
	 *  日期设置：设置多少天后的时间类型 如：明天的这个时候 则days=1
	 *  @param int days 多少天之后
	 *  @return Date
	 */
	public static Date getDate(int days) {
		Calendar calendar = Calendar.getInstance();
		int day = calendar.get(Calendar.DAY_OF_MONTH);
		day += days;
		calendar.set(Calendar.DAY_OF_MONTH, day);
		return calendar.getTime();
	}
	
	static String[] weeks = { "日", "一", "二", "三", "四", "五", "六" };
	/** 得当某个日期是那个月的第几周.
	 * @param Date 
	 * @return String YYYY年MM月  第week周
	 */
	public static String toMonthWeekFormat(final Date d) {
		if (d == null) {
			return null;
		}
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(d);
		String str = FormatDate.NYShortFormat(d);
		return str + " [第"+weeks[calendar.get(Calendar.WEEK_OF_MONTH)]+"周]";
	}
//	static String[] weeks = { "日", "一", "二", "三", "四", "五", "六" };
	/** 得当某个日期是那个月的星期几.
	 * @param Date 
	 * @return String YYYY年MM月dd日  星期
	 */
	public static String toWeekDayFormat(final Date d) {
		if (d == null) {
			return null;
		}
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(d);
		String str = FormatDate.toShortFormat(d);
		return str + " [星期"+ weeks[calendar.get(Calendar.DAY_OF_WEEK)-1]+"]";
	}
	
	/***
     * 上个月最后一天
     * @return
     */
    public static String getLastMonthDay() {
        Calendar cal = Calendar.getInstance();
        Date date = new Date();
        cal.setTime(date);
        cal.add(Calendar.MONTH, -1);
        int year = cal.get(Calendar.YEAR);
        int month = cal.get(Calendar.MONTH)+1; // 上个月月份
        int day = cal.getActualMaximum(Calendar.DAY_OF_MONTH); // 结束天数
        String endDay = year + "-" + month + "-" + day;
        return endDay;
    }
    
    /**
     *求两个日期差
     *@param beginDate  开始日期
     *@param endDate   结束日期
     *@return 两个日期相差天数
     */
   public static long GetDateMargin(Date beginDate,Date endDate){
       long margin = 0;

       margin = endDate.getTime() - beginDate.getTime();

       margin = margin/(1000*60*60*24);

       return margin;
   }
   
   /**
    * 求今天是星期几
    * @param pTime
    * @return
    * @throws Exception
    */
   	public  static  int  dayForWeek(String pTime) throws  Exception {  
   		SimpleDateFormat	format = new  SimpleDateFormat("yyyy-MM-dd" );  
   		 Calendar c = Calendar.getInstance();  
   		 c.setTime(format.parse(pTime));  
   		 int  dayForWeek = 0 ;  
   		 if (c.get(Calendar.DAY_OF_WEEK) == 1 ){  
   		  dayForWeek = 7 ;  
   		 }else {  
   		  dayForWeek = c.get(Calendar.DAY_OF_WEEK) - 1 ;  
   		 }  
   		 return  dayForWeek;  
   		} 
   	
   	@SuppressWarnings("unused")
	public static void getTime(Date date) {
           if(date == null) date=new Date();
           Calendar calendar=Calendar.getInstance();
           calendar.setTime(date);
           int dow=calendar.get(Calendar.DAY_OF_WEEK);
           if(dow==7) dow=0;
           SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
           //本周最小日期
           calendar.add(Calendar.DAY_OF_YEAR, -dow);
           String strDate=sdf.format(calendar.getTime());
            
//         本周最大日期
           calendar.add(Calendar.DAY_OF_YEAR, 6);
           strDate=sdf.format(calendar.getTime());
       }
   	
   	
   	/**
   	 * 
   	 * @param flag
   	 *            星期（1-7）
   	 * @return 日期（2012-11-08）
   	 */
   	public static String sDateByMonth(int w) {
   		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
   		GregorianCalendar c = new GregorianCalendar();
   		// 如果大于7或者小于1,返回当前日期
   		if (w > GregorianCalendar.DAY_OF_WEEK || w < 1) {
   			return sdf.format(c.getTime());
   		}
   		int curWeek = c.get(Calendar.DAY_OF_WEEK) - 1;
   		if (curWeek < w) {
   			c.add(Calendar.DATE, w - curWeek);
   		} else if (curWeek > w) {
   			c.add(Calendar.DATE, GregorianCalendar.DAY_OF_WEEK - (curWeek - w));
   		}
   		return sdf.format(c.getTime());
   	}
   
   
	public static String dateTime(Date date) {
		return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
	}

	public static String date(Date date) {
		return new SimpleDateFormat("yyyy-MM-dd").format(date);
	}
	
	/**
	 * @category 获取两个时间的时间差(分钟)
	 * @date 2015年11月26日
	 * @param date1
	 * @param date2
	 * @return
	 */
	public static Long getDifftime(Date date1, Date date2) {
		Long t1 = date1.getTime();
		Long t2 = date2.getTime();
		Long difftime = Math.abs(t2 - t1);
		if (difftime > 0) {
			difftime = difftime / (1000 * 60);
		}
		return difftime;
	}
	
	/**
	 * @category 获取某个时间与当前时间的时间差(分钟)
	 * @date 2015年11月26日
	 * @param date1
	 * @param date2
	 * @return
	 */
	public static Long getDifftime(Date date) {
		return getDifftime(date, new Date());
	}
	
	/**
	 * @category 求指定日期前或后n天的日期
	 * @date 2015年11月26日
	 * @param date
	 * @param day
	 * @param type(0:前, 1:后)
	 * @return
	 */
	public static Date getSomeDate(Date date, int day, int type) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		int temp = cal.get(Calendar.DAY_OF_MONTH);
		if (type == 1) {
			temp = temp + day;
		} else {
			temp = temp - day;
		}
		cal.set(Calendar.DAY_OF_MONTH, temp);
		return cal.getTime();
	}
	
	/**
	 * @category 求当前日期前或后n天的日期
	 * @date 2015年11月26日
	 * @param date
	 * @param day
	 * @param type(0:前, 1:后)
	 * @return
	 */
	public static Date getSomeDate(int day, int type) {
		return getSomeDate(new Date(), day, type);
	}
	
}
